#!/bin/bash
#
# /etc/rc.sysinit
#
# Special for Archlive
# 2010.11.16 Carbon Jiao changed base on initscripts 2010.07-1
#

. /etc/rc.conf
. /etc/rc.d/functions
. /usr/lib/liblinuxlive

/usr/bin/clear

archlive_rev="Rev.$(cat /etc/arch-release)"
ARCH=$(arch)
debug_log "启动到真实系统的rc.sysinit"

welcome_archlive () {

echo
if [ "${msg_lang}" = "cn" ]; then
	printf "\033[1;33;40m   欢迎使用 Archlive !                                                                ${archlive_rev}\n"
else
	printf "\033[1;33;40m   Welcome to Archlive!                                                               ${archlive_rev}\n"
fi
printf "\033[1;32;40m   ***********************************************************************************************\033[1;0m\n"
if [ "${msg_lang}" = "cn" ]; then
	printf "\033[1;34;40m   Archlive\033[1;0m, 基于\033[1;34;40mArch GNU/Linux\033[1;0m的\033[1;32;40mlive系统 (${ARCH})\033[1;0m.\n"
	printf "\033[1;31;40m   此系统基于GNU通用发布协议(GPL)发行\033[1;0m\n"
else
	printf "\033[1;34;40m   Archlive\033[1;0m, \033[1;32;40mlive system (${ARCH}) \033[1;0mbase on ${C_OTHER}Arch GNU/Linux\033[1;0m.\n"
	printf "\033[1;31;40m   Distributed under the GNU General Public License (GPL)\033[1;0m\n"  
fi
printf "\033[1;32;40m   ***********************************************************************************************\033[1;0m\n"
echo
}

welcome_archlive

run_hook sysinit_start

# mount /proc, /sys and our RAM /dev
if ! /bin/mountpoint -q /proc; then
  /bin/mount -n -t proc none /proc
fi
if ! /bin/mountpoint -q /sys; then
  /bin/mount -n -t sysfs none /sys
fi
if ! /bin/mountpoint -q /dev; then
  if grep -q devtmpfs /proc/filesystems 2>/dev/null; then
    /bin/mount -n -t devtmpfs udev /dev -o mode=0755,size=10M,nosuid
  else
    /bin/mount -n -t tmpfs udev /dev -o mode=0755,size=10M,nosuid
  fi
fi

# Copy static device nodes to /dev
/bin/cp -a /lib/udev/devices/* /dev/

# start up our mini logger until syslog takes over
/sbin/minilogd

# anything more serious than KERN_WARNING goes to the console
# 'verbose' cmdline parameter enables more messages
if /bin/grep -q " verbose" /proc/cmdline; then
	/bin/dmesg -n 8
else
	/bin/dmesg -n 3
fi

HWCLOCK_PARAMS="--hctosys"
if [ "$HARDWARECLOCK" = "UTC" ]; then
	HWCLOCK_PARAMS="$HWCLOCK_PARAMS --utc"
elif [ "$HARDWARECLOCK" = "localtime" ]; then
	HWCLOCK_PARAMS="$HWCLOCK_PARAMS --localtime"
else
	HWCLOCK_PARAMS=""
fi

if [ -n "$HWCLOCK_PARAMS" ]; then
	# enable rtc access
	/sbin/modprobe rtc-cmos >/dev/null 2>&1
	RTC_MAJOR=$(/bin/grep -w rtc /proc/devices 2>/dev/null)
	RTC_MAJOR="${RTC_MAJOR%% *}"
	if [ -n "$RTC_MAJOR" ]; then
		if [ -e /dev/rtc0 ]; then rm -f /dev/rtc0 2>/dev/null; fi
		if [ -e /dev/rtc ]; then rm -f /dev/rtc 2>/dev/null; fi
		# 以上两句另外添加
		/bin/mknod /dev/rtc0 c $RTC_MAJOR 0 2>/dev/null
		/bin/ln -s /dev/rtc0 /dev/rtc 2>/dev/null
	fi

	# Do a clock set here for a few reasons:
	# 1. Make creation time on udev nodes sane (FS#8665)
	# 2. Filesystem checks can depend on system time
	# 3. This will set the clock, if using non-UTC, off the last known
	#    configured timezone. Any new timezone put in rc.conf is copied over at
	#    a later time.
	# This does *NOT* take into account a time adjustment file as /var may not be
	# mounted yet. A second set occurs later to match rc.conf.
	if [ -f /etc/localtime ]; then
		/sbin/hwclock $HWCLOCK_PARAMS --noadjfile
	fi
fi

echo > /proc/sys/kernel/hotplug

if [ "${msg_lang}" = "cn" ]; then
	stat_busy "启动 UDev后台服务..."
else
	stat_busy "Starting UDev Daemon"
fi
/sbin/udevd --daemon &>/dev/null
stat_done

run_hook sysinit_udevlaunched

# Trigger udev uevents
if /bin/pidof -o %PPID /sbin/udevd >/dev/null; then
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "激活 UDev事件..."
	else
		stat_busy "Triggering UDev uevents"
	fi
	/sbin/udevadm control --property=STARTUP=1 &>/dev/null
	/sbin/udevadm trigger --action=add &>/dev/null
	stat_done
fi

# Load modules from the MODULES array defined in rc.conf
if ! [ "$load_modules" = "off" ]; then
	if [ -f /proc/modules ]; then
		if [ "${msg_lang}" = "cn" ]; then
			stat_busy "载入 驱动模块..."
		else
			stat_busy "Loading Modules"
		fi
		for mod in "${MODULES[@]}"; do
			if [ "$mod" = "${mod#!}" ]; then
				/sbin/modprobe $mod
			fi
		done
		stat_done
	fi
fi

# Wait for udev uevents
if /bin/pidof -o %PPID /sbin/udevd >/dev/null; then
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "等待 UDev事件加载完成..."
	else
		stat_busy "Waiting for UDev uevents to be processed"
	fi
	/sbin/udevadm settle
	/sbin/udevadm control --property=STARTUP=
	stat_done
fi

run_hook sysinit_udevsettled

# bring up the loopback interface
if [ -d /sys/class/net/lo ]; then
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "配置 网络回环接口..."
	else
		stat_busy "Bringing up loopback interface"
	fi
	/sbin/ifconfig lo 127.0.0.1 up
	if [ $? -ne 0 ]; then
		stat_fail
	else
		stat_done
	fi
fi

# If necessary, find md devices and manually assemble RAID arrays
if [ -f /etc/mdadm.conf -a "$(/bin/grep ^ARRAY /etc/mdadm.conf 2>/dev/null)" ]; then
	if [ "${msg_lang}" = "cn" ]; then
		status "激活 RAID整列"
	else
		status "Activating RAID arrays"
	fi
	/sbin/mdadm --assemble --scan
fi

if [ "$USELVM" = "yes" -o "$USELVM" = "YES" ]; then
	if [ -x /sbin/lvm -a -d /sys/block ]; then
		# Kernel 2.6.x, LVM2 groups
		/sbin/modprobe -q dm-mod 2>/dev/null
		if [ "${msg_lang}" = "cn" ]; then
			stat_busy "激活 LVM2 加密卷管理..."
		else
			stat_busy "Activating LVM2 groups"
		fi
		#/sbin/lvm vgscan --ignorelockingfailure --mknodes >/dev/null
		/sbin/lvm vgchange --ignorelockingfailure -a y >/dev/null
		if [ $? -ne 0 ]; then
			stat_fail
		else
			stat_done
		fi
	fi
fi

# Set up non-root encrypted partition mappings
if [ -f /etc/crypttab -a -n "$(/bin/grep -v ^# /etc/crypttab | /bin/grep -v ^$)" ]; then
	/sbin/modprobe -q dm-mod 2>/dev/null
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "解锁 加密卷:"
	else
		stat_busy "Unlocking encrypted volumes:"
	fi
	csfailed=0
	CS=/sbin/cryptsetup.static
	do_crypt() {
		if [ $# -ge 3 ]; then
			cname="$1"
			csrc="$2"
			cpass="$3"
			shift 3
			copts="$*"
			stat_append "${cname}.."
			# For some fun reason, the parameter ordering varies for
			# LUKS and non-LUKS devices.  Joy.
			if [ "${cpass}" = "SWAP" ]; then
				# This is DANGEROUS! The only possible safety check
				# is to not proceed in case we find a LUKS device
				# This may cause dataloss if it is not used carefully
				if $CS isLuks $csrc 2>/dev/null; then
					false
				else
					$CS -d /dev/urandom $copts create $cname $csrc >/dev/null
					if [ $? -eq 0 ]; then
						stat_append "creating swapspace.."
						/sbin/mkswap -f -L $cname /dev/mapper/$cname >/dev/null
					fi
				fi
			elif [ "${cpass}" = "ASK" ]; then
				printf "\nOpening '${cname}' volume:\n"

				if $CS isLuks $csrc 2>/dev/null; then
					$CS $copts luksOpen $csrc $cname < /dev/console
				else
					$CS $copts create $cname $csrc < /dev/console
				fi
			elif [ "${cpass:0:1}" != "/" ]; then
				if $CS isLuks $csrc 2>/dev/null; then
					echo "$cpass" | $CS $copts luksOpen $csrc $cname >/dev/null
				else
					echo "$cpass" | $CS $copts create $cname $csrc >/dev/null
				fi
			else
				if $CS isLuks $csrc 2>/dev/null; then
					$CS -d $cpass $copts luksOpen $csrc $cname >/dev/null
				else
					$CS -d $cpass $copts create $cname $csrc >/dev/null
				fi
			fi
			if [ $? -ne 0 ]; then
				csfailed=1
				stat_append "failed "
			else
				stat_append "ok "
			fi
		fi
	}
	while read line; do
		eval do_crypt "$line"
	done </etc/crypttab
	if [ $csfailed -eq 0 ]; then
		stat_done
	else
		stat_fail
	fi
	# Maybe someone has LVM on an encrypted block device
	if [ "$USELVM" = "yes" -o "$USELVM" = "YES" ]; then
		if [ -x /sbin/lvm -a -d /sys/block ]; then
			/sbin/lvm vgchange --ignorelockingfailure -a y >/dev/null
		fi
	fi
fi

if [ "${msg_lang}" = "cn" ]; then
	status "挂载 Root分区为只读..."
else
	status "Mounting Root Read-only"
fi
#debug_shell
#/bin/mount -n -o remount,ro / &>/dev/null
# live系统不需要重新挂载
#debug_shell

FORCEFSCK=
[ -f /forcefsck ] && FORCEFSCK="-- -f"
NETFS="nonfs,nonfs4,nosmbfs,nocifs,nocodafs,noncpfs,nosysfs,noshfs,nofuse,nofuseblk,noglusterfs"

fsck_reboot() {
	if [ "${msg_lang}" = "cn" ]; then
		echo "自动重新启动系统 ..."
	else
		echo "Automatic reboot in progress..."
	fi
	/bin/umount -a
	/bin/mount -n -o remount,ro /
	/sbin/reboot -f
	exit 0
}

if [ -x /sbin/fsck ]; then
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "检查 文件系统..."
	else
		stat_busy "Checking Filesystems"
	fi
	FSCK_OUT=/dev/stdout
	FSCK_ERR=/dev/null
	/sbin/fsck -A -T -C -a -t $NETFS $FORCEFSCK >$FSCK_OUT 2>$FSCK_ERR
	fsckret=$?
	if [ ${fsckret} -gt 1 ]; then
		stat_fail
	fi
	if [ $((${fsckret}&2)) -eq 2 ]; then
		echo
		echo "********************** REBOOT REQUIRED *********************"
		echo "*                                                          *"
		echo "* The system will be rebooted automatically in 15 seconds. *"
		echo "*                                                          *"
		echo "************************************************************"
		echo
		/bin/sleep 15
		fsck_reboot
	fi
	if [ ${fsckret} -gt 1 -a ${fsckret} -ne 32 ]; then
		echo
		echo "*****************  FILESYSTEM CHECK FAILED  ****************"
		echo "*                                                          *"
		echo "*  Please repair manually and reboot. Note that the root   *"
		echo "*  file system is currently mounted read-only. To remount  *"
		echo "*  it read-write type: mount -n -o remount,rw /            *"
		echo "*  When you exit the maintenance shell the system will     *"
		echo "*  reboot automatically.                                   *"
		echo "*                                                          *"
		echo "************************************************************"
		echo
		/sbin/sulogin -p
		fsck_reboot
	fi
	stat_done
fi

if [ "${msg_lang}" = "cn" ]; then
	stat_busy "挂载 本地文件系统..."
else
	stat_busy "Mounting Local Filesystems"
fi
#debug_shell
/bin/mount -n -o remount,rw /
# live系统不需要重新挂载
if [ -x /bin/findmnt -a -e /proc/self/mountinfo ]; then
	/bin/findmnt -rnu -o SOURCE,TARGET,FSTYPE,OPTIONS >| /etc/mtab
else
	cat /proc/mounts >| /etc/mtab
fi
debug_shell
# Write /proc, /sys and /dev to /etc/mtab
if [ -e /proc/mounts ]; then
	/bin/grep -e "/proc " -e "/sys " -e "/dev " /proc/mounts >> /etc/mtab
fi
run_hook sysinit_premount

# now mount all the local filesystems
/bin/mount -a -t $NETFS -O no_netdev
#stat_done

if [ "${msg_lang}" = "cn" ]; then
	status "激活 交换分区..."
else
	status "Activating Swap"
fi
/sbin/swapon -a &>/dev/null
stat_done

if [ "${msg_lang}" = "cn" ]; then
	stat_busy "配置 系统时钟..."
else
	stat_busy "Configuring System Clock"
fi
if [ "$TIMEZONE" != "" -a -e "/usr/share/zoneinfo/$TIMEZONE" ]; then
	/bin/rm -f /etc/localtime
	/bin/cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime
fi

clock_pid=""
if [ -n "$HWCLOCK_PARAMS" ]; then
	# This time, we set the clock for real. Use the adjustment file now that
	# /var will definitely be available, and then set the system clock once
	# the hardware clock has been adjusted accordingly. The backgrounding magic
	# is due to the fact that the second call to hwclock will almost always
	# take ~1 second because of the clock granularity, and we might as well
	# stay busy.
	(
	/sbin/hwclock --adjust
	/sbin/hwclock $HWCLOCK_PARAMS
	) &
	clock_pid=$!
fi
stat_done

RANDOM_SEED=/var/lib/misc/random-seed
if [ -f $RANDOM_SEED ]; then
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "初始 随机种子..."
	else
		stat_busy "Initializing Random Seed"
	fi
	/bin/cat $RANDOM_SEED > /dev/urandom
	stat_done
fi

if [ "${msg_lang}" = "cn" ]; then
	stat_busy "删除 多余文件..."
else
	stat_busy "Removing Leftover Files"
fi
/bin/rm -f /etc/nologin &>/dev/null
/bin/rm -f /etc/shutdownpid &>/dev/null
/bin/rm -f /var/lock/* &>/dev/null
/bin/rm -rf /tmp/* /tmp/.* &>/dev/null
/bin/rm -f /forcefsck &>/dev/null
(cd /var/run && /usr/bin/find . ! -type d -exec /bin/rm -f -- {} \; )
: >| /var/run/utmp
/bin/chmod 0664 /var/run/utmp
# Keep {x,k,g}dm happy with xorg
/bin/mkdir /tmp/.ICE-unix && /bin/chmod 1777 /tmp/.ICE-unix
/bin/mkdir /tmp/.X11-unix && /bin/chmod 1777 /tmp/.X11-unix
stat_done

if [ "${msg_lang}" = "cn" ]; then
	status "更新库文件相关链接"
else
	status "Updating Shared Library Links"
fi
/sbin/ldconfig 2>&1 >/dev/null

if [ "$HOSTNAME" != "" ]; then
	if [ "${msg_lang}" = "cn" ]; then
		status "设置 主机名: $HOSTNAME" 
	else
		status "Setting Hostname: $HOSTNAME"
	fi
	/bin/hostname $HOSTNAME
fi

# Set the NIS domain name, if necessary
[ -f /etc/conf.d/nisdomainname ] && . /etc/conf.d/nisdomainname
if [ "$NISDOMAINNAME" != "" ]; then
	if [ "${msg_lang}" = "cn" ]; then
		status "设置 NIS域名: $NISDOMAINNAME"
	else
		status "Setting NIS Domain Name: $NISDOMAINNAME"
	fi
	/bin/nisdomainname $NISDOMAINNAME
fi

if [ "${msg_lang}" = "cn" ]; then
	status "更新 模块依赖关系..." 
else
	status "Updating Module Dependencies"
fi
/sbin/depmod -A

# Flush old locale settings
: >| /etc/profile.d/locale.sh
/bin/chmod 755 /etc/profile.d/locale.sh
# Set user defined locale
[ -z "$LOCALE" ] && LOCALE="en_US"
if [ "${msg_lang}" = "cn" ]; then
	stat_busy "设置 语言地区信息: $LOCALE"
else
	stat_busy "Setting Locale: $LOCALE"
fi
echo "export LANG=$LOCALE" >>/etc/profile.d/locale.sh
stat_done

if echo "$LOCALE" | /bin/grep -qi utf ; then
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "设置 控制台为UTF-8模式..."
	else
		stat_busy "Setting Consoles to UTF-8 mode"
	fi
	# UTF-8 consoles are default since 2.6.24 kernel
	# this code is needed not only for older kernels,
	# but also when user has set vt.default_utf8=0 but LOCALE is *.UTF-8.
	for i in /dev/tty[0-9]*; do
		/usr/bin/kbd_mode -u < ${i}
		printf "\033%%G" > ${i}
	done
	# the $CONSOLE check helps us avoid this when running scripts from cron
	echo 'if [ "$CONSOLE" = "" -a "$TERM" = "linux" -a -t 1 ]; then printf "\033%%G"; fi' >>/etc/profile.d/locale.sh
	stat_done
	if [ -n "$KEYMAP" ]; then
		if [ "${msg_lang}" = "cn" ]; then
			status "设置 键盘布局: $KEYMAP"
		else
			status "Loading Keyboard Map: $KEYMAP"
		fi
		/bin/loadkeys -q -u $KEYMAP
	fi
else
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "设置 控制台为传统模式"
	else
		stat_busy "Setting Consoles to legacy mode"
	fi
	# make non-UTF-8 consoles work on 2.6.24 and newer kernels
	for i in /dev/tty[0-9]*; do
		/usr/bin/kbd_mode -a < ${i}
		printf "\033%%@" > ${i}
	done
	# the $CONSOLE check helps us avoid this when running scripts from cron
	echo 'if [ "$CONSOLE" = "" -a "$TERM" = "linux" -a -t 1 ]; then printf \033%%@"; fi' >>/etc/profile.d/locale.sh
	stat_done
	if [ -n "$KEYMAP" ]; then
		if [ "${msg_lang}" = "cn" ]; then
			status "设置 键盘布局: $KEYMAP" 
		else
			status "Loading Keyboard Map: $KEYMAP"
		fi
		/bin/loadkeys -q $KEYMAP
	fi
fi

if [ -n "$CONSOLEFONT" ]; then
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "加载 控制台字体: $CONSOLEFONT"
	else
		stat_busy "Loading Console Font: $CONSOLEFONT"
	fi
	#CONSOLEMAP in UTF-8 shouldn't be used
	if [ -n "$CONSOLEMAP" ] && echo "$LOCALE" | /bin/grep -qi utf ; then
		CONSOLEMAP=""
	fi
	for i in /dev/tty[0-9]*; do
		if [ -n "$CONSOLEMAP" ]; then
			/usr/bin/setfont -m $CONSOLEMAP $CONSOLEFONT -C ${i} >/dev/null 2>&1
		else
			/usr/bin/setfont $CONSOLEFONT -C ${i} >/dev/null 2>&1
		fi
	done
	if [ $? -ne 0 ]; then
		stat_fail
	else
		for i in /dev/tty[0-9]*; do
			printf "\033(K" > ${i}
		done
		# the $CONSOLE check helps us avoid this when running scripts from cron
		echo 'if [ "$CONSOLE" = "" -a "$TERM" = "linux" -a -t 1 ]; then printf "\033(K"; fi' >>/etc/profile.d/locale.sh
		stat_done
	fi
fi

# Adding persistent network/cdrom generated rules
if [ -f "/dev/.udev/tmp-rules--70-persistent-cd.rules" ]; then
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "保存 cdrom挂载规则: $CONSOLEFONT"
	else
		stat_busy "Adding persistent cdrom udev rules"
	fi
	/bin/cat /dev/.udev/tmp-rules--70-persistent-cd.rules >> /etc/udev/rules.d/70-persistent-cd.rules
	stat_done
fi
if [ -f "/dev/.udev/tmp-rules--70-persistent-net.rules" ]; then
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "保存 网络挂载规则: $CONSOLEFONT"
	else
		stat_busy "Adding persistent network udev rules"
	fi
	/bin/cat /dev/.udev/tmp-rules--70-persistent-net.rules >> /etc/udev/rules.d/70-persistent-net.rules
	stat_done
fi


[ ! -d /var/log ] && mkdir -p /var/log >/dev/null

/bin/dmesg >| /var/log/dmesg.log

# final hwclock setting needs to be done at this point
if [ -n "$clock_pid" ]; then
	wait $clock_pid
fi

run_hook sysinit_end

debug_log "rc.sysinit启动完成"

# End of file
# vim: set ts=2 noet:
